// 权限控制
import router from '@/router'
import store from '@/store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 在permission.js文件中，引入动态路由表和后台返回得roles字段
import { asyncRoutes } from '@/router/asyncRoutes'

// 白名单
const whiteList = ['/login', '/404']
// 路由前置守卫
router.beforeEach(async(to, from, next) => {
  // 路由开始跳转前，开启进度条
  NProgress.start()
  const token = store.state.user.token
  if (token) {
    if (to.path === '/login') {
      next('/')
    } else {
      // 只有用户登录之后，才需要获取用户信息接口
      // 当用户前往任意地址都需要调用
      if (!store.state.user.userInfo.userId) {
        await store.dispatch('user/fetchUserInfo')
        // 在调用actions获取profile接口之后做路由的过滤
        console.log(store.state.user.userInfo.roles.menus, '后台返回的数据')
        console.log(asyncRoutes, '全量动态路由表数据')
        // 路由过滤：
        // 1.拿到动态路由表和后端返回的权限之后
        // 2.通过路由表中的name字段和后端返回的数组中的字段做比较
        // 3.如果对应上了说明这个路由应该留下
        // 4.得到新的过滤好的路由表
        const roles = store.state.user.userInfo.roles.menus
        const filterRoutes = asyncRoutes.filter(item => {
          return roles.includes(item.children[0].name)
        })
        router.addRoutes(filterRoutes)
        store.commit('menu/setMenuList', filterRoutes)
        console.log(filterRoutes, '过滤之后的路由表')
        next({
          ...to,
          replace: true
        })
      }
      next()
    }
  } else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
    }
  }
})

// 路由后置守卫
router.afterEach((to, from) => {
  // 当路由跳转结束后会触发，结束进度条
  NProgress.done()
})
